#include "login.h"

void init_ulist(ulist *L)
{
    *L = (ulist)malloc(sizeof(unode));
    (*L)->next = NULL;
}

void insert_unode(ulist L, user data)
{
    unode *p;
    p = L;
    while (p->next != NULL)
    {
        p = p->next;
    }
    unode *s = (unode *)malloc(sizeof(unode));
    s->data = data;
    p->next = s;
    s->next = NULL;
}

void read_file(FILE *fp, ulist L)
{
    user temp;
    while (!feof(fp))
    {
        fscanf(fp, "name:%s\tpwd:%s\n", temp.name, temp.pwd);
        insert_unode(L, temp);
    }
}

void print_ulist(ulist L)
{
    unode *p = L->next;
    while (p != NULL)
    {
        printf("name:%s\tpwd:%s\n", p->data.name, p->data.pwd);
        p = p->next;
    }
}

char getch(void)
{
    char c;
    system("stty -echo");   // 不回显
    system("stty -icanon"); // 设置一次性读完操作，如使用getchar()读操作，不需要按enter
    c = getchar();
    system("stty icanon"); // 取消上面的设置
    system("stty echo");   // 回显
    return c;
}

void my_scanf(char *password)
{
    fflush(stdin);
    int i = 0; // 记录密码长度
    char c;
    while (1)
    {
        c = getch(); // 用 _getch() 函数输入，字符不会显示在屏幕上
        if (c == '\n')
        {
            password[i] = '\0'; // 遇到回车，表明密码输入结束
            break;              // while 循环的出口
        }
        else if (c == '\b')
        {                    // 遇到退格，需要删除前一个星号
            printf("\b \b"); // 退格，打一个空格，再退格，实质上是用空格覆盖掉星号
            --i;
        }
        else
        {
            password[i++] = c; // 将字符放入数组
            printf("*");
        }
    }
    putchar('\n');
    return;
}
int login(void)
{
    ulist L;
    init_ulist(&L);
    FILE *fp = fopen("login.txt", "r");
    read_file(fp, L); // 读取文件数据到单链表中
    fclose(fp);
    while (1)
    {
        putchar('\n');
        for (int i = 0; i < 22; i++)
            printf("-");
        printf("\e[32m菜单\e[0m");
        for (int i = 0; i < 22; i++)
            printf("-");
        putchar('\n');
        for (int i = 0; i < 5; i++)
            printf("-");
        printf("1.登录");
        for (int i = 0; i < 10; i++)
            printf("-");
        printf("2.注册");
        for (int i = 0; i < 10; i++)
            printf("-");
        printf("0.退出");
        for (int i = 0; i < 5; i++)
            printf("-");

        printf("\n请输入你的操作:");
        int num1;
        scanf("%d", &num1);
        getchar(); // 吃回车
        if (num1 == 1)
        {
            for (int i = 0; i < 20; i++)
                printf("-");
            printf("登录");
            for (int i = 0; i < 20; i++)
                printf("-");
            putchar('\n');

            printf("name:");
            char name[MAX];
            char pwd[MAX];
            scanf("%s", name);
            getchar(); // 吃回车
            unode *p = L->next;
            while (p != NULL)
            {
                if (!strcmp(p->data.name, name)) // 账号正确
                {
                    printf("pwd:");
                    my_scanf(pwd);                 // scanf("%s", pwd);
                    if (!strcmp(p->data.pwd, pwd)) // 密码正确
                    {
                        system("clear"); // 清屏
                        for (int i = 0; i < 14; i++)
                            printf("~");
                        printf("\e[32m登入成功!尊贵的SSSVIP用户!\e[0m");
                        for (int i = 0; i < 13; i++)
                            printf("~");
                        putchar('\n');
                        print_plane();
                        delay(300000000);
                        system("clear");
                        return 1;
                    }
                    else
                    {
                        putchar('\n');
                        for (int i = 0; i < 10; i++)
                            printf("!");
                        printf("\e[31msorry!密码错误!\e[0m");
                        for (int i = 0; i < 10; i++)
                            printf("!");
                        putchar('\n');
                        return 0;
                    }
                }
                p = p->next;
            }
            putchar('\n');
            for (int i = 0; i < 10; i++)
                printf("!");
            printf("\e[31msorry!没有这个账号!\e[0m");
            for (int i = 0; i < 10; i++)
                printf("!");
            putchar('\n');
            return 0;
        }
        if (num1 == 0)
        {
            putchar('\n');
            for (int i = 0; i < 10; i++)
                printf("*");
            printf("\e[32m退出系统成功\e[0m");
            for (int i = 0; i < 10; i++)
                printf("*");
            putchar('\n');
            return 0;
        }
        if (num1 == 2) // 注册
        {
            puts("\n请输入你要注册的账号名字");
            printf("name:");
            char name[MAX];
            scanf("%s", name);
            getchar(); // 吃回车

            puts("请输入你的密码");
            printf("pwd:");
            char pwd1[MAX];
            my_scanf(pwd1);

            puts("\n请再次输入确定你的密码");
            printf("pwd:");
            char pwd2[MAX];
            my_scanf(pwd2);
            putchar('\n');

            if (!strcmp(pwd1, pwd2))
            {
                fp = fopen("login.txt", "a+");
                fprintf(fp, "name:%s\tpwd:%s\n", name, pwd1);
                fclose(fp);
                for (int i = 0; i < 10; i++)
                    printf("~");
                printf("\e[32m新用户注册成功!\e[0m");
                for (int i = 0; i < 10; i++)
                    printf("~");
                putchar('\n');
                continue;
            }

            else
            {
                for (int i = 0; i < 10; i++)
                    printf("!");
                printf("\e[31m俩次密码不一致!注册失败!\e[0m");
                for (int i = 0; i < 10; i++)
                    printf("~");
                putchar('\n');
                continue;
            }
        }
    }
}

void delay(long n)
{
    for (int i = 0; i < n; i++)
    {
    }
}

void print_plane(void)
{
   for(int i=0;i<50;i++)
    {
    delay(4000000);
    system("clear");
    printf("\e[?25l\e[34m\n\e[0m");

    for(int j=0;j<4+i;j++) printf("\e[?25l\e[34m \e[0m");
    printf("\e[?25l\e[34m*\n\e[0m"); // 4空格
    
    for(int j=0;j<4+i;j++) printf("\e[?25l\e[34m \e[0m");
    printf("\e[?25l\e[34m**\n\e[0m"); // 4空格
    
    for(int j=0;j<i;j++) printf("\e[?25l\e[34m \e[0m");
    printf("\e[?25l\e[34m*   ***\n\e[0m"); // 3
    
    for(int j=0;j<i;j++) printf("\e[?25l\e[34m \e[0m");
    printf("\e[?25l\e[34m**  ***\n\e[0m");
    
    for(int j=0;j<i;j++) printf("\e[?25l\e[34m \e[0m");
    printf("\e[?25l\e[34m*********\\欢迎登录\n\e[0m");
    
    for(int j=0;j<i;j++) printf("\e[?25l\e[34m \e[0m");
    printf("\e[?25l\e[34m*********/星星航空\n\e[0m");
    
    for(int j=0;j<i;j++) printf("\e[?25l\e[34m \e[0m");
    printf("\e[?25l\e[34m**  ***\n\e[0m");
    
    for(int j=0;j<i;j++) printf("\e[?25l\e[34m \e[0m");
    printf("\e[?25l\e[34m*   ***\n\e[0m");
    
    for(int j=0;j<4+i;j++) printf("\e[?25l\e[34m \e[0m");
    printf("\e[?25l\e[34m**\n\e[0m");
    
    for(int j=0;j<4+i;j++) printf("\e[?25l\e[34m \e[0m");
    printf("\e[?25l\e[34m*\e[0m");

    printf("\e[?25l\e[34m\n\e[0m");
    }
    return;
}
